/**
 * Axios请求封装
 * 统一处理请求和响应，包括错误处理和重试机制
 */

    // 创建axios实例
const request = axios.create({
    // baseURL在当前系统中不需要设置，因为使用相对路径
    timeout: 60000, // 请求超时时间：60秒
    headers: {
        'Content-Type': 'application/json;charset=UTF-8'
    }
    });

    // 重试配置
const retryConfig = {
    retries: 2,           // 重试次数
    retryDelay: 1000,     // 重试延迟（毫秒）
    retryCondition: (error) => {
        // 对网络错误和5xx错误进行重试
        return !error.response || 
               error.response.status >= 500 || 
               error.code === 'NETWORK_ERROR' ||
               error.code === 'ECONNABORTED';
    }
};

    // 请求拦截器
request.interceptors.request.use(
        config => {
        // 确保超时时间设置正确
        if (!config.timeout) {
            config.timeout = 60000;
        }
        
        // 添加请求开始时间用于性能监控
        config.metadata = { startTime: new Date() };
        
        // 如果有token也可以在这里添加到header中
            return config;
        },
        error => {
        // 处理请求错误
        console.error('请求错误:', error);
            return Promise.reject(error);
        }
    );

    // 响应拦截器
request.interceptors.response.use(
        response => {
        // 记录响应时间
        if (response.config.metadata) {
            response.config.metadata.endTime = new Date();
            response.config.metadata.duration = response.config.metadata.endTime - response.config.metadata.startTime;
            console.debug('请求耗时:', response.config.metadata.duration + 'ms', response.config.url);
        }
        
        // 如果响应状态码是200，则直接返回响应数据
        const res = response.data;
        
        // 如果后端返回的数据中包含特定的状态码
        if (response.status !== 200) {
            // 根据状态码进行不同的处理
            handleErrorStatus(response.status);
            return Promise.reject(new Error('请求失败'));
        }
        
            return response;
        },
        async error => {
        // 处理响应错误
        const config = error.config;
        
        // 记录错误时间
        if (config && config.metadata) {
            config.metadata.endTime = new Date();
            config.metadata.duration = config.metadata.endTime - config.metadata.startTime;
            console.debug('请求失败耗时:', config.metadata.duration + 'ms', config.url);
        }
        
        console.error('响应错误:', error);
        
        // 重试逻辑
        if (config && shouldRetry(error, config)) {
            return retry(config);
        }
        
        // 获取错误状态码
        const status = error.response ? error.response.status : null;
        
        // 根据状态码进行不同的处理
        if (status) {
            handleErrorStatus(status);
        } else if (error.code === 'ECONNABORTED') {
            // 请求超时
            showErrorMessage(`请求超时，请检查网络连接（超时时间：${config.timeout}ms）`);
        } else {
            // 网络错误或其他未知错误
            showErrorMessage('网络连接异常，请检查您的网络连接');
        }
        
        return Promise.reject(error);
    }
);

/**
 * 判断是否应该重试
 */
function shouldRetry(error, config) {
    return config && 
           !config.__retryCount && 
           retryConfig.retryCondition(error);
}

/**
 * 执行重试
 */
function retry(config) {
    config.__retryCount = config.__retryCount || 0;
    
    if (config.__retryCount >= retryConfig.retries) {
        return Promise.reject(config);
    }
    
    config.__retryCount += 1;
    
    console.log(`正在重试请求 (${config.__retryCount}/${retryConfig.retries}):`, config.url);
    
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(request(config));
        }, retryConfig.retryDelay);
    });
}

/**
 * 处理错误状态码
 * @param {number} status - HTTP状态码
 */
function handleErrorStatus(status) {
    switch (status) {
                    case 400:
            showErrorMessage('请求参数错误');
                        break;
                    case 401:
            showErrorMessage('未授权，请重新登录');
            // 可以在这里处理登录跳转
                        break;
                    case 403:
            showErrorMessage('拒绝访问');
                        break;
                    case 404:
            showErrorMessage('请求的资源不存在');
                        break;
                    case 500:
            showErrorMessage('服务器内部错误');
                        break;
                    case 502:
            showErrorMessage('网关错误');
                        break;
                    case 503:
            showErrorMessage('服务不可用');
                        break;
                    case 504:
            showErrorMessage('网关超时');
                        break;
                    default:
            showErrorMessage(`未知错误(${status})`);
                }
            }

/**
 * 显示错误消息
 * @param {string} message - 错误消息
 */
function showErrorMessage(message) {
    console.error(message);
    
    // 如果存在ElementUI的Message组件，则使用它显示错误消息
    if (typeof ElementUI !== 'undefined' && ElementUI.Message) {
        ElementUI.Message.error(message);
    } else {
        // 否则使用原生alert
        // alert(message);
        // 在生产环境中，通常不使用alert，而是直接在控制台输出错误信息
    }
    }

// 导出请求实例
window.request = request; 